#include <iostream>
#include <format>
using namespace std;
/**
 * 高级输出
 */
int main() {
  /**
   * 一、整型输出(printf)
   */
  // 1. 整型输出分为不同的进制
  // decimal(d) octal(o) hexadecimal(x, X)
  cout << "================" << "整型输出(printf)(不同进制输出)" << "================" << endl;
  int d = 255;
  printf("%d\n", d);
  printf("%o\n", d);
  printf("%x\n", d);
  printf("%X\n", d);
  printf("%#o\n", d);
  printf("%#x\n", d);
  printf("%#X\n", d);

  // 2. 整型输出区分不同数据类型大小
  // short(h) long(l) long long(ll)
  cout << "================" << "整型输出(printf)(不同长度输出)" << "================" << endl;
  long long lld = 2147483648;
  printf("%d\n", lld);
  printf("%lld\n", lld);
  unsigned short us = 65535;
  printf("%hd\n", us);
  printf("%hu\n", us);

  /**
   * 二、整型输出(cout)
   */
  // 1. 整型输出分为不同的进制
  // 以输出8进制为例：
  // a. cout << oct;
  // b. cout.setf(ios::oct, ios::basefield);
  // c. cout.flags(ios::oct);
  // d. #include <iomanip>
  // cout << setbase(8);
  cout << "================" << "整型输出(cout)(不同进制输出)" << "================" << endl;
  cout << oct;
  cout << 8 << ' ' << 16 << endl;
  cout << dec;
  cout << 8 << ' ' << 16 << endl;
  cout << hex;
  cout << 8 << ' ' << 16 << endl;
  cout << uppercase;
  cout << 188 << ' ' << 126 << endl;
  cout << nouppercase;
  cout << 188 << ' ' << 126 << endl;
  cout << showbase;
  cout << 188 << ' ' << 126 << endl;
  cout << noshowbase;
  cout << 188 << ' ' << 126 << endl;
  cout << "================" << "整型输出(cout)(语义明确不需要关注数据长度，但是需要明确当前的格式 \
  \n（有些格式是一次设置的有些是全局的容易搞混），比较繁琐)" << "================" << endl;
  
  /**
   * 三、整型输出（format)
   */
  cout << "================" << "整型输出(format)(不同进制输出)" << "================" << endl;
  cout << format("{}", d) << endl;
  cout << format("{:o}", d) << endl;
  cout << format("{:x}", d) << endl;
  cout << format("{:X}", d) << endl;
  cout << format("{:#o}", d) << endl;
  cout << format("{:#x}", d) << endl;
  cout << format("{:#X}", d) << endl;
  cout << format("{:b}", d) << endl;
  cout << format("{:#b}", d) << endl;
  cout << format("{:#B}", d) << endl;

  /**
   * 四、字符输出
   */
  cout << "================" << "字符型输出" << "================" << endl;
  char c = 'a';
  printf("%c\n", c);
  cout << c << endl;
  cout << format("{}", c) << endl;
  printf("%d\n", c);
  printf("%c\n", 97);
  cout << format("{:d} {:c}", c, 97) << endl;

  /**
   * 五、bool输出
   */
  cout << "================" << "bool型输出" << "================" << endl;
  bool t = true;
  bool f = false;
  printf("%d %d\n",  t, f);
  cout << t << " " << f << endl; // 1 0
  cout << boolalpha;
  cout << t << " " << f << endl; // true false
  cout << format("{} {}", t, f) << endl; // true false
  cout << format("{:d} {:d}", t, f) << endl; // 1 0

  /**
   * 五、浮点输出
   */
  cout << "================" << "浮点型输出(printf)" << "================" << endl;
  float ff = 12.3456789012;
  printf("%f\n", ff);  // 保留6位小数
  printf("%e\n", ff);  // 科学计数法
  printf("%g\n", ff);  // 通用输出，保留6位有效数字
  printf("%a\n", ff);  // 以16进制科学计数法表示
  printf("%.8f\n", ff); //  保留小数点后固定的位数（不一定精确）
  printf("%.*f\n", 10, ff); //  保留小数点后固定的位数（不一定精确）

  double dd = 12.3456789012;
  printf("%.10lf\n", dd);

  /**
   * 六、浮点输出
   */
  cout << "================" << "浮点型输出(cout)" << "================" << endl;
  cout << ff << endl;  //  默认输出，6位有效数字
  cout << fixed;
  cout << ff << endl;   // 浮点输出，6位小数
  cout << defaultfloat;
  cout << ff << endl;   // 通用输出=默认输出
  cout << scientific;
  cout << ff << endl;   // 科学计数法
  cout << hexfloat;
  cout << ff << endl;   // 16进制的科学计数法
  cout.precision(10);   // 10位小数浮点数输出
  cout << fixed;
  cout << ff << endl;

  /**
   * 七、浮点输出
   */
  cout << "================" << "浮点型输出(format)" << "================" << endl;
  cout << format("{:f}", ff) << endl;
  cout << format("{:e}", ff) << endl;
  cout << format("{:g}", ff) << endl;
  cout << format("{:a}", ff) << endl;
  cout << format("{}", ff) << endl;   // 最准确的输出，8位有效数字，7位准确的
  cout << format("{:.8f}", ff) << endl;
  cout << format("{:.{}f}", ff, 10) << endl;

  /**
   * 八、宽度输出
   */
  cout << "================" << "宽度输出" << "================" << endl;
  int ddd = 255;
  printf("%7d|\n", ddd);
  printf("%-7d|\n", ddd);

  cout.width(7); // 单次有效
  cout << ddd << "|" << endl;
  cout << left;
  cout.width(7);
  cout << ddd << "|" << endl;

  cout << format("{:>7}", ddd) << endl;
  cout << format("{:<7}", ddd) << endl;
  cout << format("{:^7}", ddd) << endl;

  /**
   * 九、选择数据输出
   */
  cout << "================" << "选择数据输出" << "================" << endl;
  cout << format("{0:4d}{0:4o}{0:4x}", 255) << endl;
  cout << format("{2}{1}{0}{3}", 'a', 'b', 'c', 'd') << endl;
  return 0;
}